"""
解题思路

这是一道较为精彩的题目，也是前缀和的一个升级版的玩法。

这道题目首要目标是找到和为 k 的子数组的个数。如果仅仅是这样，我们可以通过双指针的方式
前后索引，但是关键在于他的数据范围：-1000 <= nums[i] <= 1000；这就意味着我们并不
可以采用双指针的方式了，因为无法保证数组和单调递增。

那么问题来了，这该怎么去做呢？

我们思考一下如何满足子数组和为K的条件？
假设total为我们前缀和后的数组，则total[j] - total[i] == k ,且 j > i的情况下满足条件。
那么我们变形一下公式即可得到，total[j] - k == total[i],如果total[i]存在，则满足条件。
同时还需要考虑一个问题，即如果存在total[a] == total[i]，且a,i < j则算是满足两次条件。
所以我们需要知道当total[j] - k == total[i]成立时，在j之前有多少和total[i]值一样大的。

知道这些以后我们梳理一下思路，当我们在遍历累加的同时，可以统计total[i]的数量，且需要比较
total[j] - k 是否存在，如果存在则答案加上所对应数量的个数。最后循环遍历结束，获得最终结果

转换成代码表示如下。

"""


class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        count = {0:1}
        total, ans = 0, 0
        for i in range(len(nums)):
            total += nums[i]
            ans += count.get(total - k, 0)
            count[total] = count.get(total, 0) + 1
        return ans